// od_seprate_blocks [异或]分积木 问题200分题目
// https://www.nowcoder.com/discuss/957454
//解法：只要把他们全部相加起来异或等于0就行，
// 因为如果除最小的那个其他的数按二进制不进位相加起来等于最小的那个数相等的话，他们异或后等于0
// 所以只要总的加起来后异或等于0就代表着最小的那一个跟其他数“相加”后相等
// 分糖果 https://blog.csdn.net/Fredroid/article/details/100753070
// 位异或
//华为机试2021-1-29 https://blog.csdn.net/qq_40016949/article/details/113762549
// 1、给定一个字符串,统计最长的连续元音字符串。长度小于655535，难度1星
// 2、打车打表器没有数字4，遇到数字4跳过。给定一个打表器上的数字推算实际金额。
//打表器遇到4,14,24,34,40,41,42.。。。49都不在记录内。
//例如打表显示5实际金额是4，打表显示25实际是22。难度1星
// =============================================
// solo和koko是两兄弟，分一堆积木，每块积木有自己的重量。现在他们将积木分成两堆，
//弟弟koko还小只会将数字转化为二进制进行计算，而且总是忘记进位。弟弟koko按照他计算的方式要求两堆积木重量相等，
//要不然就会哭。哥哥solo进行分积木希望尽量给弟弟少分，并且不让弟弟哭。eg：弟弟计算方式（难度3星）
// 1100   十进制 --12
//+0101   十进制--5
//———---
// 1001  十进制--9
//输入的第一行是一个整数N(2 ≤ N ≤ 15)，表示有袋中多少块糖。
//第二行包含N个用空格分开的整数Ci (1 ≤ Ci ≤ 106)，表示第i块糖的重量。
//输出如果能让koko不哭，输出Solo所能获得的糖的总重量，否则输出“NO”。
//题目会给你两行输入，第一行N代表了有多少个积木， 第二行就会给你 N个数字。
//输入 3
// 3 5 6
//第一行代表了有3个积木，第二行用空格分开的3个数，告诉你每个积木的重量。
//  0101(5)
//  0110(6)
// --------
//  0011(3)
//输入 10
// 5 4 3 2 6 7 19 8 1 9
//代表有10个积木，第二行告诉你这10个积木重量分别是什么
//输入 10
// 16 3 7 16 10 14 11 6 1 12
//输出 95

#include <bits/stdc++.h>

#include <algorithm>
#include <iostream>
using namespace std;

int sperateBlocks(vector<int> vtBlock) {
  if (vtBlock.size() <= 0) return -1;
  if (vtBlock.size() == 2 && vtBlock[0] != vtBlock[1]) return -1;
  int nMin = vtBlock[0];
  int nSum = vtBlock[0];
  int nXor = vtBlock[0];
  for (size_t i = 1; i < vtBlock.size(); i++) {
    nSum += vtBlock[i];
    nMin = min(vtBlock[i], nMin);
    nXor ^= vtBlock[i];
    printf("===========%d, %d, %d\n", nSum, nMin, nXor);
  }
  if (nXor != 0) {
    return -1;
  }
  printf("sum=%d,min=%d\n", nSum, nMin);
  return nSum - nMin;
}

int main() {
  // {5,4,3,2,6,7,19,8,1,9}
  // {3,5,6}
  srand(time(nullptr));
  vector<int> arr = {16, 3, 7, 16, 10, 14, 11, 6, 1, 12};
  //    for (int i = 0; i < 10; i++ ) arr.push_back(rand()%20);
  for (int i = 0; i < 10; i++) printf("%d,", arr[i]);
  printf("\n");

  int n = sperateBlocks(arr);
  printf("%d\n", n);
  return 0;
}
